Projeto Final
Introdução
Projeto Final: Análise de Dados da Olist Store (2016 a 2018)
Este projeto tem como foco a análise dos dados da Olist Store, uma plataforma de e-commerce que conecta pequenos e médios lojistas a diversos marketplaces. O objetivo é compreender o comportamento do mercado, identificar padrões de venda e avaliar a eficiência das operações da plataforma no período de 2016 a 2018. A análise será útil para lojistas que utilizam a plataforma, consumidores e profissionais de e-commerce e logística, oferecendo insights baseados em dados que podem otimizar estratégias de vendas e aprimorar a experiência do cliente.
Os dados utilizados foram disponibilizados pelo Kaggle e contêm informações detalhadas sobre pedidos, produtos, vendedores e avaliações de clientes. A análise será realizada com o uso de R, juntamente com pacotes como ggplot2 e plotly, para explorar os dados, identificar padrões e investigar correlações. Entre as métricas analisadas estão o desempenho das categorias de produtos e a satisfação do cliente, com foco em tendências temporais e geográficas.
Com uma abordagem quantitativa, esta análise buscará identificar tendências de vendas e padrões sazonais, além de avaliar o impacto de fatores externos, como localização dos vendedores, sobre os resultados. Esses insights podem ser utilizados por lojistas para otimizar seus estoques, estratégias de marketing e atendimento ao cliente, além de fornecer uma visão clara sobre quais categorias de produtos são mais lucrativas.
A Olist é uma plataforma que
facilita a integração de pequenos e médios lojistas a marketplaces,
oferecendo suporte logístico e de atendimento. Isso permite que os
vendedores ampliem seu alcance e se concentrem no crescimento dos
negócios. Para mais informações sobre os dados utilizados nesta análise,
acesse:Kaggle
- Brazilian E-Commerce Dataset.
Pacotes utilizados
library(knitr) # Para renderizar documentos em RMarkdown.
library(dplyr) # Manipulação e transformação de dados.
library(ggplot2) # Visualização de dados.
library(plotly) # Gráficos interativos a partir dos objetos ggplot2.
library(scales) # Formatação e escala de eixos e rótulos em gráficos.
library(lubridate) # Manipulação de datas e horários.
library(rnaturalearth) # Dados geoespaciais de países e continentes.
library(kableExtra) # Melhorar a apresentação de tabelas geradas com knitr::kable().
library(tidytext) # Análise de texto e manipulação de textos.
library(tidyr) # Para limpeza e organização de dados.
library(gridExtra) # Para combinar gráficos em um único layout.
library(stringr) # Manipulação de strings.Preparação dos Dados
Neste projeto, utilizaremos um conjunto de dados que contém 9 tabelas. Para facilitar a análise, vamos utilizar algumas dessas tabelas e dividir o processo em duas partes, agrupando as mais relevantes em cada etapa. Abaixo, apresentamos uma visão geral do schema das tabelas, destacando as conexões entre elas:
Tabelas Utilizadas na Primeira Análise
Itens do Pedido
# Carregar os dados dos itens do pedido
order_items_df <- read.csv("datasets/olist_order_items_dataset.csv")
# Mostrar as primeiras linhas do dataset de itens do pedido
kable(head(order_items_df))| order_id | order_item_id | product_id | seller_id | shipping_limit_date | price | freight_value |
|---|---|---|---|---|---|---|
| 00010242fe8c5a6d1ba2dd792cb16214 | 1 | 4244733e06e7ecb4970a6e2683c13e61 | 48436dade18ac8b2bce089ec2a041202 | 2017-09-19 09:45:35 | 58.90 | 13.29 |
| 00018f77f2f0320c557190d7a144bdd3 | 1 | e5f2d52b802189ee658865ca93d83a8f | dd7ddc04e1b6c2c614352b383efe2d36 | 2017-05-03 11:05:13 | 239.90 | 19.93 |
| 000229ec398224ef6ca0657da4fc703e | 1 | c777355d18b72b67abbeef9df44fd0fd | 5b51032eddd242adc84c38acab88f23d | 2018-01-18 14:48:30 | 199.00 | 17.87 |
| 00024acbcdf0a6daa1e931b038114c75 | 1 | 7634da152a4610f1595efa32f14722fc | 9d7a1d34a5052409006425275ba1c2b4 | 2018-08-15 10:10:18 | 12.99 | 12.79 |
| 00042b26cf59d7ce69dfabb4e55b4fd9 | 1 | ac6c3623068f30de03045865e4e10089 | df560393f3a51e74553ab94004ba5c87 | 2017-02-13 13:57:51 | 199.90 | 18.14 |
| 00048cc3ae777c65dbb7d2a0634bc1ea | 1 | ef92defde845ab8450f9d70c526ef70f | 6426d21aca402a131fc0a5d0960a3c90 | 2017-05-23 03:55:27 | 21.90 | 12.69 |
Metadados do pedido
Número total de linhas: 112.650
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| order_id | character | ID do pedido |
| order_item_id | integer | ID do item do pedido |
| product_id | character | ID do produto |
| seller_id | character | ID do vendedor |
| shipping_limit_date | character | Data limite de envio |
| price | numeric | Preço |
| freight_value | numeric | Valor do frete |
Produtos
# Carregar os dados dos produtos
products_df <- read.csv("datasets/olist_products_dataset.csv")
# Mostrar as primeiras linhas do dataset de produtos
kable(head(products_df))| product_id | product_category_name | product_name_lenght | product_description_lenght | product_photos_qty | product_weight_g | product_length_cm | product_height_cm | product_width_cm |
|---|---|---|---|---|---|---|---|---|
| 1e9e8ef04dbcff4541ed26657ea517e5 | perfumaria | 40 | 287 | 1 | 225 | 16 | 10 | 14 |
| 3aa071139cb16b67ca9e5dea641aaa2f | artes | 44 | 276 | 1 | 1000 | 30 | 18 | 20 |
| 96bd76ec8810374ed1b65e291975717f | esporte_lazer | 46 | 250 | 1 | 154 | 18 | 9 | 15 |
| cef67bcfe19066a932b7673e239eb23d | bebes | 27 | 261 | 1 | 371 | 26 | 4 | 26 |
| 9dc1a7de274444849c219cff195d0b71 | utilidades_domesticas | 37 | 402 | 4 | 625 | 20 | 17 | 13 |
| 41d3672d4792049fa1779bb35283ed13 | instrumentos_musicais | 60 | 745 | 1 | 200 | 38 | 5 | 11 |
Metadados do produto
Número total de linhas: 32.951
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| product_id | character | ID do produto |
| product_category_name | character | Nome da categoria do produto |
| product_name_length | integer | Comprimento do nome do produto |
| product_description_length | integer | Comprimento da descrição do produto |
| product_photos_qty | integer | Quantidade de fotos do produto |
| product_weight_g | integer | Peso do produto (em gramas) |
| product_length_cm | integer | Comprimento do produto (em cm) |
| product_height_cm | integer | Altura do produto (em cm) |
| product_width_cm | integer | Largura do produto (em cm) |
Vendedores
# Carregar os dados dos vendedores
sellers_df <- read.csv("datasets/olist_sellers_dataset.csv")
# Mostrar as primeiras linhas do dataset de vendedores
kable(head(sellers_df))| seller_id | seller_zip_code_prefix | seller_city | seller_state |
|---|---|---|---|
| 3442f8959a84dea7ee197c632cb2df15 | 13023 | campinas | SP |
| d1b65fc7debc3361ea86b5f14c68d2e2 | 13844 | mogi guacu | SP |
| ce3ad9de960102d0677a81f5d0bb7b2d | 20031 | rio de janeiro | RJ |
| c0f3eea2e14555b6faeea3dd58c1b1c3 | 4195 | sao paulo | SP |
| 51a04a8a6bdcb23deccc82b0b80742cf | 12914 | braganca paulista | SP |
| c240c4061717ac1806ae6ee72be3533b | 20920 | rio de janeiro | RJ |
Metadados do vendedores
Número total de linhas: 3.095
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| seller_id | character | ID do vendedor |
| seller_zip_code_prefix | integer | Prefixo do CEP do vendedor |
| seller_city | character | Cidade do vendedor |
| seller_state | character | Estado do vendedor |
Mesclando as Tabelas
# Mesclar o dataset de itens do pedido com o dataset de produtos para adicionar a categoria de cada produto
merged_df <- merge(order_items_df,
products_df[, c("product_id", "product_category_name")],
by = "product_id",
all.x = TRUE)
# Mesclar o dataset resultante com o dataset de vendedores para adicionar o estado de cada vendedor
final_df <- merge(merged_df,
sellers_df[, c("seller_id", "seller_state")],
by = "seller_id",
all.x = TRUE)
# Mostrar as primeiras linhas do dataset mesclado
kable(head(final_df))| seller_id | product_id | order_id | order_item_id | shipping_limit_date | price | freight_value | product_category_name | seller_state |
|---|---|---|---|---|---|---|---|---|
| 0015a82c2db000af6aaaf3ae2ecb0532 | a2ff5a97bf95719e38ea2e3b4105bce8 | d455a8cb295653b55abda06d434ab492 | 1 | 2017-10-12 22:24:16 | 895 | 21.02 | eletroportateis | SP |
| 0015a82c2db000af6aaaf3ae2ecb0532 | a2ff5a97bf95719e38ea2e3b4105bce8 | 9dc8d1a6f16f1b89874c29c9d8d30447 | 1 | 2017-10-18 14:49:22 | 895 | 21.02 | eletroportateis | SP |
| 0015a82c2db000af6aaaf3ae2ecb0532 | a2ff5a97bf95719e38ea2e3b4105bce8 | 7f39ba4c9052be115350065d07583cac | 1 | 2017-10-24 23:56:20 | 895 | 21.02 | eletroportateis | SP |
| 001cca7ae9ae17fb1caed9dfb1094831 | 08574b074924071f4e201e151b152b4e | dea9b7dcae5affc919947e72bcc1e786 | 2 | 2017-08-22 03:26:10 | 99 | 37.99 | ferramentas_jardim | ES |
| 001cca7ae9ae17fb1caed9dfb1094831 | 08574b074924071f4e201e151b152b4e | d63f6af53a35a1d7e6a58ec09548b9ed | 1 | 2017-06-29 02:25:12 | 89 | 37.92 | ferramentas_jardim | ES |
| 001cca7ae9ae17fb1caed9dfb1094831 | 08574b074924071f4e201e151b152b4e | e957b106ffd9736003e8249630634a04 | 1 | 2017-10-09 16:07:16 | 99 | 73.54 | ferramentas_jardim | ES |
Selecionando Colunas Relevantes
# Selecionar apenas as colunas relevantes: nome da categoria, preço, data limite de envio, e estado do vendedor
final_df <- final_df %>%
select(product_category_name, price, shipping_limit_date, seller_state)
# Mostrar as primeiras linhas do dataset filtrado
kable(head(final_df))| product_category_name | price | shipping_limit_date | seller_state |
|---|---|---|---|
| eletroportateis | 895 | 2017-10-12 22:24:16 | SP |
| eletroportateis | 895 | 2017-10-18 14:49:22 | SP |
| eletroportateis | 895 | 2017-10-24 23:56:20 | SP |
| ferramentas_jardim | 99 | 2017-08-22 03:26:10 | ES |
| ferramentas_jardim | 89 | 2017-06-29 02:25:12 | ES |
| ferramentas_jardim | 99 | 2017-10-09 16:07:16 | ES |
Limpando os Dados
# Remover registros que não possuem categoria de produto
final_df <- final_df[which(final_df$product_category_name != ""), ]
# Converter a coluna 'shipping_limit_date' para o formato de data
final_df$shipping_limit_date <- as.Date(final_df$shipping_limit_date)
# Mostrar as primeiras linhas do dataset final, limpo e pronto para análise
kable(head(final_df))| product_category_name | price | shipping_limit_date | seller_state |
|---|---|---|---|
| eletroportateis | 895 | 2017-10-12 | SP |
| eletroportateis | 895 | 2017-10-18 | SP |
| eletroportateis | 895 | 2017-10-24 | SP |
| ferramentas_jardim | 99 | 2017-08-22 | ES |
| ferramentas_jardim | 89 | 2017-06-29 | ES |
| ferramentas_jardim | 99 | 2017-10-09 | ES |
Metadados da tabela final
Número total de linhas: 111.047
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| product_category_name | character | Nome da categoria do produto |
| price | Numeric | Preço |
| shipping_limit_date | Date | Data limite de envio |
| seller_state | character | Estado do vendedor |
Tabelas para segunda parte da analise
Reviews
# Carregar os dados dos reviews
olist_order_reviews <- read.csv("datasets/olist_order_reviews_dataset.csv")
# Mostrar as primeiras linhas do dataset de reviews
kable(head(olist_order_reviews))| review_id | order_id | review_score | review_comment_title | review_comment_message | review_creation_date | review_answer_timestamp |
|---|---|---|---|---|---|---|
| 7bc2406110b926393aa56f80a40eba40 | 73fc7af87114b39712e6da79b0a377eb | 4 | 2018-01-18 00:00:00 | 2018-01-18 21:46:59 | ||
| 80e641a11e56f04c1ad469d5645fdfde | a548910a1c6147796b98fdf73dbeba33 | 5 | 2018-03-10 00:00:00 | 2018-03-11 03:05:13 | ||
| 228ce5500dc1d8e020d8d1322874b6f0 | f9e4b658b201a9f2ecdecbb34bed034b | 5 | 2018-02-17 00:00:00 | 2018-02-18 14:36:24 | ||
| e64fb393e7b32834bb789ff8bb30750e | 658677c97b385a9be170737859d3511b | 5 | Recebi bem antes do prazo estipulado. | 2017-04-21 00:00:00 | 2017-04-21 22:02:06 | |
| f7c4243c7fe1938f181bec41a392bdeb | 8e6bfb81e283fa7e4f11123a3fb894f1 | 5 | Parabéns lojas lannister adorei comprar pela Internet seguro e prático Parabéns a todos feliz Páscoa | 2018-03-01 00:00:00 | 2018-03-02 10:26:53 | |
| 15197aa66ff4d0650b5434f1b46cda19 | b18dcdf73be66366873cd26c5724d1dc | 1 | 2018-04-13 00:00:00 | 2018-04-16 00:39:37 |
Metadados da tabela de reviews
Número total de linhas: 99.224
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| review_id | character | ID da avaliação |
| order_id | character | ID do pedido |
| review_score | Integer | Pontuação da avaliação |
| review_comment_title | character | Título do comentário da avaliação |
| review_comment_message | character | Mensagem do comentário da avaliação |
| review_creation_date | character | Data de criação da avaliação |
| review_answer_timestamp | character | Data e hora da resposta à avaliação |
Selecionando Colunas Relevantes
# Selecionar apenas as colunas relevantes: nome da categoria, preço, data limite de envio, e estado do vendedor
olist_order_reviews <- olist_order_reviews %>%
select(review_score, review_comment_title, review_comment_message)
# Mostrar as primeiras linhas do dataset filtrado
kable(head(olist_order_reviews))| review_score | review_comment_title | review_comment_message |
|---|---|---|
| 4 | ||
| 5 | ||
| 5 | ||
| 5 | Recebi bem antes do prazo estipulado. | |
| 5 | Parabéns lojas lannister adorei comprar pela Internet seguro e prático Parabéns a todos feliz Páscoa | |
| 1 |
Metadados da tabela final de reviews
Número total de linhas: 99.224
| Nome_do_Campo | Tipo_de_Dado | Descrição |
|---|---|---|
| review_score | Integer | Pontuação da avaliação |
| review_comment_title | character | Título do comentário da avaliação |
| review_comment_message | character | Mensagem do comentário da avaliação |
Analises
Categorias de Produtos Mais Vendidas
# Criar o dataframe com as categorias mais vendidas
top_10_categoria <- final_df %>%
group_by(product_category_name) %>%
summarise(total_pedidos = n()) %>%
arrange(desc(total_pedidos))%>%
head(10)
# Criar o gráfico de barras
p <- ggplot(top_10_categoria, aes(x = reorder(product_category_name, total_pedidos), y = total_pedidos)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(title = "Top 10 Categorias de Produtos Mais Vendidas",
x = "Categoria de Produto",
y = "Total de Pedidos") +
theme_minimal() # Estilo clean para o gráfico
# Tornar o gráfico interativo com plotly, removendo as informações extras
p_interativo <- ggplotly(p, tooltip = c("y")) %>%
layout(
width = 700 # Defina a largura desejada
)
# Exibir o gráfico interativo
p_interativo
1. Identificação das Categorias de Produtos Mais
Vendidas: Através da análise de categorias de produtos mais
vendidas, conseguimos visualizar quais são os produtos que geram maior
volume de pedidos. Isso pode auxiliar a equipe de marketing a direcionar
campanhas mais eficazes, focando nas categorias com maior demanda.
Receita Total e Preço Médio por Categoria
# Calcular a receita total e o preço médio por categoria
analise_comb <- final_df %>%
group_by(product_category_name) %>%
summarise(
receita_total = sum(price, na.rm = TRUE),
preco_medio = mean(price, na.rm = TRUE)
) %>%
arrange(desc(receita_total)) %>%
slice(1:5) # Seleciona as top 5 categorias
# Calculando o fator de escala para ajustar o gráfico de linha ao gráfico de barras
scale_factor <- max(analise_comb$receita_total) / max(analise_comb$preco_medio)
# Adicionar coluna transformada para o gráfico de linha
analise_comb <- analise_comb %>%
mutate(preco_medio_ajustado = preco_medio * scale_factor)
# Criar o gráfico combinado com ggplot2
p <- ggplot(analise_comb, aes(x = reorder(product_category_name, receita_total))) +
geom_bar(aes(y = receita_total, text = paste("Receita Total: R$", scales::comma(receita_total))),
stat = "identity", fill = "steelblue", width = 0.6) +
geom_line(aes(y = preco_medio_ajustado, group = 1, text = paste("Preço Médio: R$", scales::comma(preco_medio, accuracy = 0.01))),
color = "darkred", size = 1.5) +
geom_point(aes(y = preco_medio_ajustado, text = paste("Preço Médio: R$", scales::comma(preco_medio, accuracy = 0.01))),
color = "darkred", size = 3) +
scale_y_continuous(
name = "Receita Total (R$)",
sec.axis = sec_axis(~ . / scale_factor, name = "Preço Médio (R$)")
) +
labs(
title = "Receita Total e Preço Médio por Categoria de Produto Top 5",
x = "Categoria de Produto"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold")
)
# Tornar o gráfico interativo usando plotly e ajustar o tooltip
p_interativo <- ggplotly(p, tooltip = c("text")) %>%
layout(
width = 700, # Defina a largura desejada
height = 500 # Defina a altura desejada
)
# Exibir o gráfico interativo
p_interativo
2. Receita Total e Preço Médio por Categoria:
O gráfico combinado entre receita total e preço médio por categoria de
produto oferece insights sobre quais categorias são mais lucrativas e
como o preço médio dos produtos pode influenciar essa lucratividade.
Isso é crucial para a estratégia de precificação e priorização de
inventário.
Total de Pedidos por Mês
# Agrupar os dados por mês e contar o número total de pedidos por mês, somando os anos
pedidos_por_mes <- final_df %>%
mutate(month = month(shipping_limit_date, label = TRUE)) %>%
group_by(month) %>%
summarise(total_pedidos = n()) %>%
arrange(month)
# Criar o gráfico de barras
p <- ggplot(pedidos_por_mes, aes(x = month, y = total_pedidos)) +
geom_bar(stat = "identity",fill = "steelblue") +
geom_text(aes(label = total_pedidos), vjust = -0.5, color = "black", size = 3.5) +
labs(
title = "Total de Pedidos por Mês (Todos os Anos)",
x = "Mês",
y = "Total de Pedidos"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "none"
)
# Exibir o gráfico
print(p)
3. Análise Temporal dos Pedidos: Ao analisar a
distribuição dos pedidos ao longo dos meses, independentemente do ano, é
possível identificar padrões sazonais e picos de vendas. Essas
informações são fundamentais para planejamento de estoque e campanhas
sazonais.
Distribuição de Pedidos por Estado
# Carregar o shapefile dos estados brasileiros
brasil_estados <- ne_states(country = "Brazil", returnclass = "sf")
# Agrupar os dados por estado e contar o número de pedidos
pedidos_por_estado <- final_df %>%
group_by(seller_state) %>%
summarise(total_pedidos = n())
# Unir o shapefile dos estados com os dados dos pedidos
brasil_estados <- brasil_estados %>%
left_join(pedidos_por_estado, by = c("postal" = "seller_state"))
# Mapa de calor com ggplot2
p <- ggplot(data = brasil_estados) +
geom_sf(aes(fill = total_pedidos), color = "white") +
scale_fill_viridis_c(option = "plasma", na.value = "grey90") +
labs(
title = "Distribuição de Pedidos por Estado",
fill = "Total de Pedidos /"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
# Converter para um gráfico interativo
p_interativo <- ggplotly(p)
# Exibir o gráfico interativo
p_interativo
4. Distribuição Geográfica dos Pedidos: A
distribuição de pedidos por estado, visualizada em um mapa de calor,
revela quais regiões têm maior concentração de vendas. Essas informações
podem ser utilizadas para otimizar a logística de distribuição, além de
identificar oportunidades para expansão em mercados menos explorados.
Reviews
# Contar quantas reviews existem para cada score e quantas delas possuem comentário (em uma das colunas de título ou mensagem)
result <- olist_order_reviews %>%
group_by(review_score) %>%
summarise(
total_reviews = n(), # Total de reviews para cada score
reviews_com_comentarios = sum(
!is.na(review_comment_title) & review_comment_title != "" |
!is.na(review_comment_message) & review_comment_message != ""
) # Contar reviews com algum comentário (título ou mensagem)
)
# Criar o gráfico de barras
p <- ggplot(result, aes(x = factor(review_score))) +
geom_bar(aes(y = total_reviews, fill = "Total de Reviews"), stat = "identity", position = "dodge", color = "black") +
geom_bar(aes(y = reviews_com_comentarios, fill = "Reviews com Comentários "), stat = "identity", position = "dodge", color = "black") +
labs(title = "Distribuição de Reviews e Comentários por Score",
x = "Score de Review",
y = "Número de Reviews",
fill = "Legenda") +
scale_fill_manual(values = c("Total de Reviews" = "steelblue", "Reviews com Comentários " = "darkorange")) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1), # Rotacionar os rótulos do eixo X
plot.margin = margin(20, 10, 10, 10, "pt"), # Ajustar margens para evitar corte
legend.position = "top", # Mover a legenda para o topo
legend.text = element_text(size = 10), # Tamanho do texto da legenda
legend.title = element_text(size = 12) # Tamanho do título da legenda
)
# Converter para um gráfico interativo
p_interativo <- ggplotly(p, tooltip = c("y"))
# Exibir o gráfico interativo
p_interativo
5. Análise das Reviews e Comentários: Esta
análise explora a distribuição de reviews por pontuação (score) e a
proporção de reviews que contém comentários textuais. Compreender o
relacionamento entre a pontuação e a presença de feedback escrito é
essencial para identificar oportunidades de melhoria e estratégias de
comunicação com os clientes. O gráfico mostra que reviews com pontuações
extremas (1 e 5) tendem a ter mais comentários, enquanto notas
intermediárias podem indicar clientes que não tiveram experiências
marcantes.
Principais Padrões de Palavras em Reviews
# Filtrar os comentários positivos e negativos, removendo NAs, strings vazias e eliminando espaços em branco extras
comentarios_positivos <- olist_order_reviews %>%
filter(review_score %in% c(4, 5)) %>%
filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>% # Remover NAs e strings vazias
mutate(review_comment_message = str_squish(review_comment_message)) %>% # Remover espaços em branco extras
select(review_comment_message) %>%
unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3)
# Filtrar os comentários positivos e negativos, removendo NAs, strings vazias e eliminando espaços em branco extras
comentarios_positivos <- olist_order_reviews %>%
filter(review_score %in% c(4, 5)) %>%
filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>% # Remover NAs e strings vazias
mutate(review_comment_message = str_squish(review_comment_message)) %>% # Remover espaços em branco extras
select(review_comment_message) %>%
unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3) %>%
filter(trigram != "NA") # Remover trigramas com NA
comentarios_negativos <- olist_order_reviews %>%
filter(review_score %in% c(1, 2)) %>%
filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>% # Remover NAs e strings vazias
mutate(review_comment_message = str_squish(review_comment_message)) %>% # Remover espaços em branco extras
select(review_comment_message) %>%
unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3) %>%
filter(trigram != "NA") # Remover trigramas com NA
# Contar os trigramas mais frequentes nos comentários positivos e negativos
trigramas_positivos <- comentarios_positivos %>%
count(trigram, sort = TRUE) %>%
top_n(10)
trigramas_negativos <- comentarios_negativos %>%
count(trigram, sort = TRUE) %>%
top_n(10)
# Gráfico para trigramas positivos
grafico_positivos <- ggplot(trigramas_positivos, aes(x = reorder(trigram, n), y = n)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(title = "Principais Comentários Positivos",
x = NULL, y = "Frequência") +
theme_minimal()
# Gráfico para trigramas negativos
grafico_negativos <- ggplot(trigramas_negativos, aes(x = reorder(trigram, n), y = n)) +
geom_bar(stat = "identity", fill = "brown") +
coord_flip() +
labs(title = "Principais Comentários Negativos",
x = NULL, y = "Frequência") +
theme_minimal()
# Mostrar os gráficos lado a lado
grid.arrange(grafico_positivos, grafico_negativos, ncol = 2)
6. Análise de Trigramas em Comentários Positivos e
Negativos: A análise de trigramas oferece uma visão mais
detalhada sobre os temas recorrentes nas avaliações dos clientes,
permitindo identificar padrões de feedback nos comentários positivos e
negativos. Isso pode ajudar a entender os principais fatores que levam à
satisfação ou insatisfação dos clientes. As palavras mais frequentes nos
comentários positivos e negativos revelam áreas que devem ser destacadas
nas campanhas de marketing ou ajustadas para melhorar a experiência do
cliente.
Conclusão
A partir da análise dos dados da Olist Store, foram extraídas informações cruciais que podem orientar decisões estratégicas para otimizar o desempenho da loja. Compreender os padrões de venda e comportamento dos clientes ao longo de diferentes categorias de produtos, regiões geográficas e períodos temporais oferece uma base sólida para melhorar a eficiência operacional e aumentar a lucratividade.
Identificar as categorias de produtos mais populares e avaliar suas margens de lucro permite ajustar o foco da empresa em áreas com maior potencial de crescimento e rentabilidade. Além disso, entender a sazonalidade e as flutuações na demanda possibilita uma melhor previsão de vendas e o planejamento adequado de estoques, evitando desperdícios ou falta de produtos durante os períodos de pico.
A análise geográfica dos pedidos, por sua vez, permite o aprimoramento das estratégias de distribuição e logística, focando em regiões onde há maior demanda ou buscando oportunidades em mercados menos explorados.
Essas percepções juntas podem guiar ações para aumentar a eficiência, expandir para novos mercados e otimizar a oferta de produtos, promovendo um crescimento sustentável para a Olist Store.